package org.six11.olive3.client;

import java.net.MalformedURLException;
import java.net.URL;

import javax.swing.JApplet;

import org.six11.olive3.net.OliveNetworkTransmitter;
import org.six11.olive3.util.MultiState;
import org.six11.util2.Debug;

/**
 * 
 * 
 * @author Gabe Johnson <johnsogg@cmu.edu>
 * 
 */
public class OliveApplet extends JApplet {

  static {
    Debug.useColor = false;
  }

  /**
   * Constructor for OliveApplet.
   */
  public OliveApplet() {
    super();
  }

  /**
   * Called by the browser or applet viewer to inform this applet that it should start its
   * execution. It is called after the <code>init</code> method and each time the applet is
   * revisited in a Web page.
   * <p>
   * 
   * A subclass of <code>Applet</code> should override this method if it has any operation that it
   * wants to perform each time the Web page containing it is visited. For example, an applet with
   * animation might want to use the <code>start</code> method to resume animation, and the
   * <code>stop</code> method to suspend the animation.
   * <p>
   */
  public void start() {
    bug("start");
  }

  /**
   * Called by the browser or applet viewer to inform this applet that it should stop its execution.
   * It is called when the Web page that contains this applet has been replaced by another page, and
   * also just before the applet is to be destroyed.
   * <p>
   * 
   * A subclass of <code>Applet</code> should override this method if it has any operation that it
   * wants to perform each time the Web page containing it is no longer visible. For example, an
   * applet with animation might want to use the <code>start</code> method to resume animation, and
   * the <code>stop</code> method to suspend the animation.
   * <p>
   */
  public void stop() {
    bug("stop");
  }

  /**
   * Called by the browser or applet viewer to inform this applet that it has been loaded into the
   * system. It is always called before the first time that the <code>start</code> method is called.
   * <p>
   * 
   * A subclass of <code>Applet</code> should override this method if it has initialization to
   * perform. For example, an applet with threads would use the <code>init</code> method to create
   * the threads and the <code>destroy</code> method to kill them.
   * <p>
   */
  public void init() {
    bug("init");
    //OliveState state = new OliveState();
    MultiState state = new MultiState();
    OliveNetworkTransmitter xmit;
    try {
      xmit = new OliveNetworkTransmitter(state, new URL("http://localhost:8080/picturephone/ink"));
      xmit.addToMessage("login ()", "");
      OliveDrawingSurface olive = new OliveDrawingSurface(xmit, new OliveState(state));
      add(olive);
    } catch (MalformedURLException ex) {
      ex.printStackTrace();
    }
  }

  /**
   * Called by the browser or applet viewer to inform this applet that it is being reclaimed and
   * that it should destroy any resources that it has allocated. The <code>stop</code> method will
   * always be called before <code>destroy</code>.
   * <p>
   * 
   * A subclass of <code>Applet</code> should override this method if it has any operation that it
   * wants to perform before it is destroyed. For example, an applet with threads would use the
   * <code>init</code> method to create the threads and the <code>destroy</code> method to kill
   * them.
   * <p>
   */
  public void destroy() {
    bug("destroy");
  }

  /**
   * Returns information about this applet. An applet should override this method to return a
   * <code>String</code> containing information about the author, version, and copyright of the
   * applet.
   * <p>
   * 
   * @return a string containing information about the author, version, and copyright of the applet.
   */
  public String getAppletInfo() {
    return "This my default applet created by Eclipse";
  }

  // @SuppressWarnings("unused")
  private void bug(final String what) {
    Debug.out("OliveApplet", what);
  }

}
